# - Find FTD2XX (D2XX Interface)
# 定义变量:
#  FTD2XX_FOUND
#  FTD2XX_INCLUDE_DIR
#  FTD2XX_LIBRARY
#  FTD2XX_VERSION (若头文件中有版本信息)

#如果需要静态链接，则只需要把FTD2XX_USE_STATIC 置为 ON

#FindPackageHandleStandardArgs 是 CMake 提供的一个标准模块，用于简化查找库时的变量验证和错误处理。
#它会自动处理 REQUIRED 参数，并在找不到库时输出错误信息。
include(FindPackageHandleStandardArgs)

# 设置库的根目录 允许用户通过环境变量或 CMake 变量指定路径
set(FTD2XX_ROOT "" CACHE PATH "Root directory of ftd2xx installation")
if(NOT FTD2XX_ROOT)
    set(FTD2XX_ROOT "$ENV{FTD2XX_ROOT}") #如果用户没有显式设置 FTD2XX_ROOT，则尝试从环境变量 FTD2XX_ROOT 中获取路径。
endif()

# 搜索头文件
find_path(FTD2XX_INCLUDE_DIR
    NAMES ftd2xx.h
    HINTS ${FTD2XX_ROOT} "${CMAKE_CURRENT_LIST_DIR}/ftd2xx" #指定搜索路径，优先级从高到低
    PATH_SUFFIXES include  #指定路径后缀，CMake 会在每个搜索路径下尝试添加这些后缀
)

# 确定架构后缀 (i386 或 amd64)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    set(_arch amd64)
else()
    set(_arch i386)
endif()

# 选择静态库或动态库 可以通过 -DFTD2XX_USE_STATIC=ON 启用静态链接。
option(FTD2XX_USE_STATIC "Link ftd2xx static library" OFF)
if(FTD2XX_USE_STATIC)
    set(_libdir lib)
else()
    set(_libdir dll)
endif()

# 搜索库文件
find_library(FTD2XX_LIBRARY
    NAMES ftd2xx  #查找的库名称
    HINTS ${FTD2XX_ROOT} "${CMAKE_CURRENT_LIST_DIR}/ftd2xx"  #指定搜索路径，优先级从高到低
    PATH_SUFFIXES "${_libdir}/${_arch}"
)

# 使用 find_package_handle_standard_args 验证是否成功找到库，REQUIRED_VARS 指定必须找到的变量（FTD2XX_INCLUDE_DIR 和 FTD2XX_LIBRARY）
#，如果这些变量都有效，则设置 FTD2XX_FOUND 为 TRUE，否则输出错误信息
find_package_handle_standard_args(ftd2xx
    REQUIRED_VARS FTD2XX_INCLUDE_DIR FTD2XX_LIBRARY
)

# 创建导入目标
if(FTD2XX_FOUND AND NOT TARGET ftd2xx::ftd2xx)
    add_library(ftd2xx::ftd2xx UNKNOWN IMPORTED) #定义一个导入库目标，类型为 UNKNOWN IMPORTED
    set_target_properties(ftd2xx::ftd2xx PROPERTIES #设置目标的属性
        IMPORTED_LOCATION "${FTD2XX_LIBRARY}" #指定库文件的路径
        INTERFACE_INCLUDE_DIRECTORIES "${FTD2XX_INCLUDE_DIR}" #指定头文件目录，供依赖此目标的其他目标使用
    )
    # 如果是静态链接，添加宏定义 FTD2XX_STATIC
    if(FTD2XX_USE_STATIC)
        add_compile_options(/MT)# 如果使用静态链接则增加 /MT  标志
        target_compile_definitions(ftd2xx::ftd2xx INTERFACE FTD2XX_STATIC)
    endif()
endif()
